package src;

import java.util.Stack;

public class Atributo<Valor> {

	//Constructora
	public Atributo()  {
		dependencias = new Stack<Atributo>();
		calculado = false;
		descripcion = "<descripcion de atributo no disponible>";
	} 

	//Setters
	public void fijaExpresion(ExpSem<Valor> exp) {
		this.exp = exp;  
	}
	public void fijaDescripcion(String descripcion) {
		this.descripcion = descripcion;  
	}
	
	//Getters
	public String descripcion() {
		return descripcion;  
	}

	public Valor val() {
		if (! calculado()) 
			throw new RuntimeException("Atributo no calculado:"+descripcion); 
		return valor;   
	}
	
	public boolean calculado() {
		return calculado; 
	}
 
	
	// Funciones
	
	public void calcula() {
		this.valor = exp.val();
		calculado = true;
	}
		
	// Dependencias
	public Atributo siguienteDependencia() {
		while (! dependencias.isEmpty()) {
			Atributo siguiente = dependencias.pop();
			if (!siguiente.calculado()) return siguiente;
		}
		return null; 
	} 
	public void ponDependencias(Atributo ... as) {
		for(Atributo a: as) {  
			dependencias.push(a);
		}  
	}
	

	/** Atributos **/
	private Valor valor;
	private Stack<Atributo> dependencias; 
	private boolean calculado;
	private ExpSem<Valor> exp;
	private String descripcion;
}
